#ifndef REIGN_DESKTOP

#pragma once
#include "SehnsuchtPrecompiled.hxx"

// Helper class that initializes DirectX APIs for both 2D and 3D rendering.
// Some of the code in this class may be omitted if only 2D or only 3D rendering is being used.
namespace Sehnsucht
{
	ref_class_decl DirectXBaseForRuntimeXAML
	{
	public_owned_access:
		DirectXBaseForRuntimeXAML(D3D_DRIVER_TYPE driver = D3D_DRIVER_TYPE_HARDWARE);
		float ConvertDipsToPixels(float dips);
		void SetDpi(float dpi);

		void Initialize(
			Windows::UI::Core::CoreWindow^ window,
			Windows::UI::Xaml::Controls::SwapChainBackgroundPanel^ panel,
			float dpi
			);

		void CreateWindowSizeDependentResources();
		void CreateDeviceIndependentResources();
		void CreateDeviceResources();
		void UpdateForWindowSizeChange();
		void HandleDeviceLost();
		void ValidateDevice();
		void Present();

		REIGN_FORCEINLINING void Bind()
		{
			m_d3dContext->OMSetRenderTargets(1, m_d3dRenderTargetView.GetAddressOf(), m_d3dDepthStencilView.Get());
			m_d3dContext->RSSetViewports(1, &m_viewport);
		}

	protected_owned_access: 

		Platform::Agile<Windows::UI::Core::CoreWindow> m_window;
		Windows::UI::Xaml::Controls::SwapChainBackgroundPanel^ m_panel;

		// DirectWrite & Windows Imaging Component Objects.
		Microsoft::WRL::ComPtr<IDWriteFactory1> m_dwriteFactory;
		Microsoft::WRL::ComPtr<IWICImagingFactory2> m_wicFactory;

		// DirectX Core Objects. Required for 2D and 3D.
		Microsoft::WRL::ComPtr<ID3D11Device1> m_d3dDevice;
		Microsoft::WRL::ComPtr<ID3D11DeviceContext1> m_d3dContext;
		Microsoft::WRL::ComPtr<IDXGISwapChain1> m_swapChain;
		Microsoft::WRL::ComPtr<ID3D11RenderTargetView> m_d3dRenderTargetView;

		// Direct2D Rendering Objects. Required for 2D.
		Microsoft::WRL::ComPtr<ID2D1Factory1> m_d2dFactory;
		Microsoft::WRL::ComPtr<ID2D1Device> m_d2dDevice;
		Microsoft::WRL::ComPtr<ID2D1DeviceContext> m_d2dContext;
		Microsoft::WRL::ComPtr<ID2D1Bitmap1> m_d2dTargetBitmap;

		// Direct3D Rendering Objects. Required for 3D.
		Microsoft::WRL::ComPtr<ID3D11DepthStencilView> m_d3dDepthStencilView;

		// Cached renderer properties.
		D3D_FEATURE_LEVEL m_d3dFeatureLevel;
		Windows::Foundation::Size m_d3dRenderTargetSize;
		Windows::Foundation::Rect m_windowBounds;
		float m_dpi;
		Windows::Graphics::Display::DisplayOrientations m_orientation;

		// Transforms used for display orientation.
		D2D1::Matrix3x2F m_orientationTransform2D;
		DirectX::XMFLOAT4X4 m_orientationTransform3D;

		D3D11_VIEWPORT m_viewport;
		D3D_DRIVER_TYPE m_driver;
	};

}

#endif
